// 导入必要的模块和配置
import js from "@eslint/js";
import globals from "globals";
import tseslint from "typescript-eslint";
import pluginVue from "eslint-plugin-vue";
import { defineConfig } from "eslint/config";

/**
 * ESLint配置函数
 * 该函数定义了ESLint的行为和要应用的规则
 * 它接受一个配置数组作为参数，数组中的每个对象代表一组特定的配置
 */
export default defineConfig([
  // 配置JavaScript文件的ESLint规则
  {
    // 指定要处理的文件模式
    files: ["**/*.{js,mjs,cjs,ts,vue}"],
    // 加载JavaScript语言的ESLint插件
    plugins: { js },
    // 扩展JavaScript推荐规则
    extends: ["js/recommended"],
  },
  // 配置浏览器全局变量
  {
    // 指定要处理的文件模式，与上一个对象相同
    files: ["**/*.{js,mjs,cjs,ts,vue}"],
    // 设置语言选项，使用浏览器全局变量
    languageOptions: { globals: { ...globals.browser, ...globals.node } },
  },
  // 应用TypeScript ESLint推荐配置
  tseslint.configs.recommended,
  // 应用Vue.js ESLint插件的“flat/essential”配置
  pluginVue.configs["flat/essential"],
  // 特别配置Vue文件的解析器
  {
    // 指定要处理的文件模式，仅限Vue文件
    files: ["**/*.vue"],
    // 设置语言选项，为Vue文件指定TypeScript解析器
    languageOptions: { parserOptions: { parser: tseslint.parser } },
  },
  // 添加自定义规则配置
  {
    // 指定规则适用的文件类型
    files: ["**/*.{js,mjs,cjs,ts,vue}"],
    rules: {
      // eslint规则配置（https://eslint.nodejs.cn/docs/latest/rules/）
      "no-var": "error", // 要求使用 let 或 const 而不是 var
      "no-console": process.env.NODE_ENV === "production" ? "error" : "off", // 在生产环境中禁止使用console.log
      "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off", // 在生产环境中禁止使用debugger
      "no-unexpected-multiline": "error", // 禁止空余的多行
      "no-useless-escape": "off", // 禁止不必要的转义字符
      semi: "off", // 语句后的分号
      "no-use-before-define": "off",
      "space-before-function-paren": "off",
      // typeScript规则配置（https://typescript-eslint.io/rules）
      "@typescript-eslint/no-unused-vars": "error", // 禁止定义未使用的变量
      "@typescript-eslint/prefer-ts-expect-error": "error", // 禁止使用 @ts-ignore
      "@typescript-eslint/no-explicit-any": "off", // 禁止使用 any 类型
      "@typescript-eslint/no-non-null-assertion": "off",
      "@typescript-eslint/no-namespace": "off", // 禁止使用自定义 Typescript 模块和命名空间
      "@typescript-eslint/ban-ts-ignore": "off",
      "@typescript-eslint/explicit-function-return-type": "off",
      "@typescript-eslint/no-var-requires": "off",
      "@typescript-eslint/no-empty-function": "off",
      "@typescript-eslint/no-use-before-define": "off",
      "@typescript-eslint/ban-ts-comment": "off",
      "@typescript-eslint/ban-types": "off",
      "@typescript-eslint/explicit-module-boundary-types": "off",
      // eslint-plugin-vue规则配置（https://eslint.vuejs.org/rules/）
      "vue/multi-word-component-names": "off", // 要求组件名称始终为“_”链接的单词
      "vue/no-mutating-props": "off", // 不允许组件 prop 的改变
      "vue/attribute-hyphenation": "off", // 对模板中的自定义组件强制执行属性命名样式
      "vue/custom-event-name-casing": "off",
      "vue/no-setup-props-destructure": "off",
      "vue/no-reserved-component-names": "off",
      "vue/attributes-order": "off",
      "vue/one-component-per-file": "off",
      "vue/html-closing-bracket-newline": "off",
      "vue/max-attributes-per-line": "off",
      "vue/multiline-html-element-content-newline": "off",
      "vue/singleline-html-element-content-newline": "off",
      "vue/require-default-prop": "off",
      "vue/require-explicit-emits": "off",
      "vue/html-self-closing": [
        "error",
        {
          html: {
            void: "always",
            normal: "never",
            component: "always",
          },
          svg: "always",
          math: "always",
        },
      ], // 规范html标签的闭合方式
      "vue/no-v-html": "off",
    },
  },
]);
